package 数组.旋转数组的最小数字;

/**
 * @author: wh(1835734390 @ qq.com)
 * @date: 2023/3/6 17:04
 * @description:剑指offer
 * @version:
 */
public class Solution {
    public static void main(String[] args) {

    }

    //二分法
    public static int minArray(int[] numbers) {
        int left = 0, right = numbers.length - 1;
        while (left < right) {
            int mid = (left + right) / 2;
            //如果中间点的数字大于最右边的数字，那么转折点就这右侧
            if (numbers[mid] > numbers[right]) left = mid + 1;
            //如果中间点的数字小于最右侧的数字，那么转折点就这左侧(中间点也有可能是转折点)
            else if (numbers[mid] < numbers[right]) right = mid;
            //当 nums[m]=nums[j]nums[m] = nums[j]nums[m]=nums[j] 时： 无法判断 mmm 在哪个排序数组中，即无法判断旋转点 xxx 在 [i,m][i, m][i,m] 还是 [m+1,j][m + 1, j][m+1,j] 区间中
            // 解决方案： 执行 j=j−1j = j - 1j=j−1 缩小判断范围
            else right--;
        }
        return numbers[left];
    }
}
